package GUI;

/**
 * Principal.java
 * Representa la interfaz grafica del juego
 * 
 * @author Vicente, Sebastian
 * @author Perez Rago, Alejandro
 */

import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.LineBorder;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.HashMap;






import Logica.*;
import Logica.Celda.Celda;
/**
* This code was edited or generated using CloudGarden's Jigloo
* SWT/Swing GUI Builder, which is free for non-commercial
* use. If Jigloo is being used commercially (ie, by a corporation,
* company or business for any purpose whatever) then you
* should purchase a license for each developer using Jigloo.
* Please visit www.cloudgarden.com for details.
* Use of Jigloo implies acceptance of these licensing terms.
* A COMMERCIAL LICENSE HAS NOT BEEN PURCHASED FOR
* THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED
* LEGALLY FOR ANY CORPORATE OR COMMERCIAL PURPOSE.
*/
public class Principal extends javax.swing.JFrame {

	/**
	* Auto-generated main method to display this JFrame
	*/
	protected Map<Integer,ImageIcon> mapeo;
	protected Juego juego;
	protected JLabel[][] miMatriz;
	protected Map<Integer,String> mapeo2;
	protected JPanel barrapanel;
	protected JPanel Game;
	protected Celda[][] tablero;
	protected JProgressBar barra;
	protected JLabel actualRobot;		//guarda la referencia al JLabel donde esta actualmente el robot
	protected JButton reiniciar;
	protected JButton comenzar;
	protected JLabel puntaje;
	protected JPanel Comandos;
	protected JLabel disparo;
	protected javax.swing.Timer swingTimer;
	protected javax.swing.Timer TimerBomb;
	protected BufferedImage[] sprites;
	protected BufferedImage[] explosion;
	protected int contBomb;
	protected int x;					//movimiento en x en el disparo
	protected int y;					//movimiento en y en el disparo
	protected JPanel panelModificar;			
	protected JLabel modificar;				//Celda a modificar en el disparo
	protected int tipoRobot;
	protected ImagePanel[][] fondo;
	protected JPanel dp;
	protected JPanel contenedor;
	protected String nivel;
	
	public Principal(int i,String nivelElegido) {
		super();
		
		nivel=nivelElegido;
		tipoRobot=i;
		initJuego();
		
	}
	
	/**
	 *Carga el mapeo con ImageIcon para utilizarse en las etiquetas 
	 */
	private void cargarMapeo(){
		mapeo=new HashMap<Integer,ImageIcon>();
		mapeo.put(1,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/sand1.jpg")));
		mapeo.put(2,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/baliza.png")));
		mapeo.put(3,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/Cono.png")));
		mapeo.put(4,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/Concrete.png")));
		mapeo.put(5,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/plant1.png")));
		mapeo.put(6,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/box1.png")));
		mapeo.put(7,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/pared2.png")));
		mapeo.put(8,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/Misil.png")));
		mapeo.put(9,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/coin1.png")));
		mapeo.put(10,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/Barrel_of_oil.png")));
		mapeo.put(11,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/sandBlack.png")));
		mapeo.put(21,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/sandWhite.png")));
		mapeo.put(31,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/stone1.jpg")));
		mapeo.put(41,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/stoneBlack.png")));		
		mapeo.put(51,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/stoneWhite.png")));		
		mapeo.put(61,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/lava.jpg")));
		mapeo.put(62,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/water4.jpg")));
		mapeo.put(91,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/civil_n.png")));
		mapeo.put(92,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/civil_e.png")));
		mapeo.put(93,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/civil_s.png")));
		mapeo.put(94,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/civil_w.png")));		
		mapeo.put(96,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/militar_n.png")));
		mapeo.put(97,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/militar_e.png")));
		mapeo.put(98,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/militar_s.png")));
		mapeo.put(99,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/militar_w.png")));
		mapeo.put(100,new ImageIcon(this.getClass().getClassLoader().getResource("Images/48/meta.png")));
	
	}
	
	
	/**
	 * Carga el mapeo2 con la ruta de la imagen a utilizar en los ImagePanel
	 */
	private void cargarMapeo2(){
		mapeo2=new HashMap<Integer,String>();
		mapeo2.put(1,"Images/48/sand1.jpg");
		mapeo2.put(11,"Images/48/sandBlack.png");
		mapeo2.put(21,"Images/48/sandWhite.png");
		mapeo2.put(31,"Images/48/stone1.jpg");
		mapeo2.put(41,"Images/48/stoneBlack.png");
		mapeo2.put(51,"Images/48/stoneWhite.png");
		mapeo2.put(61,"Images/48/lava.jpg");
		mapeo2.put(62,"Images/48/water4.jpg");
	}
	
	/**
	 * Inicia el juego, creando los paneles y definiendo los tamaños de las ventanas
	 */
	private void initJuego() {
		try {
			////System.out.println("dp? "+(dp!=null));
			////System.out.println("CORRECTA");
			juego= new Juego(tipoRobot,nivel);
			Game=new JPanel();
			crearDisparo();
			tablero=juego.getInfoEscenario();
			//System.out.println("tablero"+tablero==null);
			contenedor=new JPanel();
			contenedor.setLayout(null);
			cargarMapeo();
			getContentPane().setLayout(null);
			iniciarBarra();
			contenedor.add(barrapanel);
			iniciarComandos();
			contenedor.add(Comandos);
			iniciarGame();
			
			contenedor.add(Game);
			this.setResizable(false);
			setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
						
			this.actualizarRobot();
			contenedor.addKeyListener(new KeyComando());
			pack();	
			this.setSize(barrapanel.getWidth()+5,600+barrapanel.getHeight() +50);
			contenedor.setBounds(0,0,getWidth(),getHeight());
			getContentPane().add(contenedor);
			this.setLocationRelativeTo(null);
			this.setVisible(true);
		} catch (Exception e) {
		    //add your error handling code here
			e.printStackTrace();
		}
	}
	
	
	/**
	 * Inicia el panel Game
	 */
	private void iniciarGame(){
		
		Game.setLayout(null);
		
		Game.setBounds(Comandos.getWidth(),barrapanel.getHeight(),48*tablero[0].length,48*tablero.length);
		actualRobot=new JLabel();
		//System.out.println("ID ROBOT: "+juego.getIDRobot());
		actualRobot.setIcon(mapeo.get(juego.getIDRobot()));
		actualRobot.setBounds(juego.getXRobot()*48,juego.getYRobot()*48,48,48);
		//System.out.println("INICIAR GAME: X "+actualRobot.getX()+" Y "+actualRobot.getY());
		Game.add(actualRobot);
		this.crearMatriz();
	}
	
	/**
	 * Inicia el panel Comandos
	 */
	
	private void iniciarComandos(){
		Comandos=new JPanel();
		Comandos.setBounds(0,barrapanel.getHeight(),75,800-barrapanel.getHeight());
		Comandos.setLayout(null);
		int y=Comandos.getHeight()/7-32;
		
		
		OyenteComando listenerComando=new OyenteComando();
		
		JButton girarIzquierda=new JButton();
		girarIzquierda.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/Left.png")));
		girarIzquierda.setBounds(21,20,32,32);
		girarIzquierda.setContentAreaFilled(false);
		girarIzquierda.setBorderPainted(false);
		girarIzquierda.setName("Izquierda");
		girarIzquierda.addActionListener(listenerComando);
		
		Comandos.add(girarIzquierda);
		
		JButton girarDerecha=new JButton();
		girarDerecha.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/Right.png")));
		girarDerecha.setBounds(21,girarIzquierda.getY()+y,32,32);
		girarDerecha.setContentAreaFilled(false);
		girarDerecha.setBorderPainted(false);
		girarDerecha.setName("Derecha");
		girarDerecha.addActionListener(listenerComando);
		Comandos.add(girarDerecha);
		
		
		JButton cargarColeccionable=new JButton();
		cargarColeccionable.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/Upload.png")));
		cargarColeccionable.setBounds(21,girarDerecha.getY()+y,32,32);
		cargarColeccionable.setContentAreaFilled(false);
		cargarColeccionable.setBorderPainted(false);
		cargarColeccionable.setName("Cargar");
		cargarColeccionable.addActionListener(listenerComando);
		Comandos.add(cargarColeccionable);
		

		JButton descargarColeccionable=new JButton();
		descargarColeccionable.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/Download.png")));
		descargarColeccionable.setBounds(21,cargarColeccionable.getY()+y,32,32);
		descargarColeccionable.setContentAreaFilled(false);
		descargarColeccionable.setBorderPainted(false);
		descargarColeccionable.setName("Descargar");
		descargarColeccionable.addActionListener(listenerComando);
		Comandos.add(descargarColeccionable);
		
		JButton sinColor=new JButton();
		sinColor.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/sinColor2.png")));
		sinColor.setBounds(21,descargarColeccionable.getY()+y,32,32);
		sinColor.setContentAreaFilled(false);
		sinColor.setBorderPainted(false);
		sinColor.setName("Sin color");
		sinColor.addActionListener(listenerComando);
		Comandos.add(sinColor);
		
		JButton pincelNegro=new JButton();
		pincelNegro.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/black.png")));
		pincelNegro.setBounds(21,sinColor.getY()+y,32,32);
		pincelNegro.setContentAreaFilled(false);
		pincelNegro.setBorderPainted(false);
		pincelNegro.setName("Negro");
		pincelNegro.addActionListener(listenerComando);
		Comandos.add(pincelNegro);
		
		JButton pincelBlanco=new JButton();
		pincelBlanco.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/white.png")));
		pincelBlanco.setBounds(21,pincelNegro.getY()+y,32,32);
		pincelBlanco.setContentAreaFilled(false);
		pincelBlanco.setBorderPainted(false);
		pincelBlanco.setName("Blanco");
		pincelBlanco.addActionListener(listenerComando);
		Comandos.add(pincelBlanco);
		
		JButton disparo=new JButton();
		disparo.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("Images/Target.png")));
		disparo.setBounds(21,pincelBlanco.getY()+y,32,32);
		disparo.setContentAreaFilled(false);
		disparo.setBorderPainted(false);
		disparo.setName("Disparo");
		disparo.addActionListener(listenerComando);
		if (tipoRobot==2){
			disparo.setEnabled(false);
		}
		Comandos.add(disparo);
		Comandos.setVisible(false);
		//setToolTipText
		
		
	}
	
	/**
	 * Inicia el panel barra
	 */
	private void iniciarBarra(){
		int barraY=30;
		int x=800;
		barrapanel=new JPanel();
		barrapanel.setLayout(null);
		barrapanel.setBounds(0,0,x,barraY);
		
				
		JLabel combustible= new JLabel();
		combustible.setText("Combustible:");
		combustible.setBounds(barrapanel.getWidth()-240,barraY/2-10,80,20);
		barrapanel.add(combustible);
		
		barra=new JProgressBar(0,juego.getCombustible());
		barra.setBounds(x-160,barraY/2-10,150,20);
		barra.setStringPainted(true);
		barrapanel.add(barra);
		
		
		puntaje = new JLabel();
		puntaje.setText("Puntos: 00000");
		puntaje.setBounds(x/2-50,barraY/2-10,100,20);
		barrapanel.add(puntaje);
		
		
		
		reiniciar=new JButton();
		reiniciar.setText("Reset");
		reiniciar.addActionListener(new OyenteReset());
		reiniciar.setBounds(110,barraY/2-10,70,20);	
		
		barrapanel.add(reiniciar);
		
				
		comenzar=new JButton();
		comenzar.setText("Comenzar");
		comenzar.addActionListener(new OyenteComenzar());
		comenzar.setBounds(10,barraY/2-10,95,20);
		
		barrapanel.add(comenzar);
	}
	
	/**
	 * Comienza la simulación del juego
	 */
	
	private void comenzar(){
		reiniciar.addKeyListener(new KeyComando());
		if (Comandos.isVisible()==false){
			Comandos.setVisible(true);
		}
		//accionarInterfaz(0,0);
		this.addKeyListener(new KeyComando());
	}
	
	/**
	 * Actualiza la imagen del robot
	 */
	private void actualizarRobot(){
		
		actualRobot.setIcon(mapeo.get(juego.getIDRobot()));
		
	}
	
	/**
	 * Actualiza la barra de combustible
	 */
	private void actualizarCombustible(){
		 verificarEstado();
		barra.setValue(juego.getCombustible());
	}

	/**
	 * Crea el mapa, con las celdas y sus objetos
	 */
	private void crearMatriz(){
		miMatriz= new JLabel[tablero.length][tablero[0].length];
		fondo= new ImagePanel[tablero.length][tablero[0].length];
		ImagePanel panel;
		this.cargarMapeo2();
		for(int f=0;f<tablero.length;f++){
			for(int c=0;c<tablero[0].length;c++){
				
				miMatriz[f][c]=new JLabel();
				int num=tablero[f][c].getID();
				if((1<num)&&(num<11)){
					miMatriz[f][c].setIcon(mapeo.get(num));
					num=1;
				}else{
					if((31<num)&&(num<41)){
						miMatriz[f][c].setIcon(mapeo.get(num-30));
						num=31;
					}
				}	
				String key=mapeo2.get(num);
				
				//Crea un panel con la imagen de fondo
				panel=new ImagePanel(key);
				panel.setLayout(null);
				panel.setBounds(c*48,f*48,48,48);
				panel.repaint();
				//panel.setBorder(new LineBorder(new java.awt.Color(0,0,0), 1, false));
				
				//Guarda el panel transitable en una matriz para poder pintarlo
				if((num==1)||(num==31)){
					fondo[f][c]=panel;
				}
				
				if(miMatriz[f][c].getIcon()!=null){
					//miMatriz[f][c].setBorder(new LineBorder(new java.awt.Color(255,255,255),1,false));
					miMatriz[f][c].setBounds(0,0,48,48);
					panel.add(miMatriz[f][c]);
					
				}else{
					
						miMatriz[f][c]=null;
					
				}
				
				Game.add(panel);
			}
		}
			JLabel efinal=new JLabel();
			efinal.setBounds(0,0,48,48);
			efinal.setIcon(mapeo.get(100));
			fondo[juego.getYposFinal()][juego.getXposFinal()].add(efinal);
		
	}
	
	

	/**
	 * Verifica el estado del robot
	 */
	private void verificarEstado(){
		if(juego.esFinal()){
			JOptionPane.showMessageDialog(this.getContentPane(),"Congratulations!!!");
			eliminarListeners();
			
		}else{
			if (!juego.tieneCombustibleRobot()){
				JOptionPane.showMessageDialog(this.getContentPane(),"GAME OVER");
				eliminarListeners();
			}
		}
	}

	/**
	 * Elimina los listeners del teclado para impedir su movimiento
	 */
	private void eliminarListeners(){
		KeyListener[] aux=reiniciar.getKeyListeners();
		for(int i=0;i<aux.length;i++){
			reiniciar.removeKeyListener(aux[i]);	
		}
				
		Comandos.setVisible(false);
	}
	
	/**
	 * Refrezca la visualizacion del juego
	 * @param d Coordenadas del robot en el juego
	 */
	
	protected void refrescarMatriz2(Dimension d){
		
		int x=(int)d.getWidth();
		int y=(int)d.getHeight();
		
		int fx=x+this.getWidth()-Comandos.getWidth();
		int fy=y+this.getHeight();
	
		
		for(int f=(y/48);f<(fy/48);f++){
			for(int c=(x/48);c<(fx/48);c++){
				int num=tablero[f][c].getID();
				
				
				if ((1<num)&&(num<11)){
					
					refrescarAuxiliar(f,c,num);
				}else{
					if((11<num)&&(num<21)){
						refrescarAuxiliar(f,c,num-10);
					}else{
						if((21<num)&&(num<31)){
							refrescarAuxiliar(f,c,num-20);
						}else{
							if ((31<num)&&(num<41)){
								refrescarAuxiliar(f,c,num-30);
							}else{
								if ((41<num)&&(num<51)){
									refrescarAuxiliar(f,c,num-40);
								}else{
									if ((51<num)&&(num<61)){
										
										refrescarAuxiliar(f,c,num-50);
									}else{
										if(miMatriz[f][c]!=null)
											miMatriz[f][c].setIcon(null);
									}
								}
							}
						}
					}
					
					
				}
					
				
				}
				
			}
		
		
		
		/*long end = //System.currentTimeMillis();
		  long res = end - start;
		  //System.out.println("Metodo refrescarMatriz: "+res+" milisegundos");
		  */
	}
	/**
	 * Cambia la imagen del objeto en la posicion (f,c)
	 * @param f coordenada en y de la celda
	 * @param c coordenada en x de la celda
	 * @param num clave del mapeo
	 */
	private void refrescarAuxiliar(int f,int c,int num){
		tablero=juego.getInfoEscenario();
		if (miMatriz[f][c]==null){
			miMatriz[f][c]=new JLabel();
			miMatriz[f][c].setBounds(0,0,48,48);
			fondo[f][c].add(miMatriz[f][c]);
		}
		miMatriz[f][c].setIcon(mapeo.get(num));
	}
	
	
	/**
	 * Actualiza la interfaz y verifica las condiciones necesarias del juego
	 */
	private void accionarInterfaz(){
		actualizarCombustible();
		Dimension aux=foco();
		refrescarMatriz2(aux);
		puntaje.setText("Puntos: "+juego.getPuntaje());
		verificarEstado();
	}
	
	/**
	 * Centra la visualizacion del robot 
	 * @return Visibilidad
	 */
	
	private Dimension foco(){
		int posX=actualRobot.getX();
		int posY=actualRobot.getY();
		int XFrame=this.getWidth()-Comandos.getWidth();
		int YFrame=this.getHeight()-barrapanel.getHeight();
		
		int Xcalculado=posX-XFrame/2;			//centra el robot en X
		int Ycalculado=posY-YFrame/2;			//centra el robot en Y
		
		if (Xcalculado<0){
			Xcalculado=0;
		}else{
			if (Xcalculado>Game.getWidth()-XFrame){
				Xcalculado=Game.getWidth()-XFrame;
			}
		}
		if (Ycalculado<0){
			Ycalculado=0;
		}else{
			if(Ycalculado>Game.getHeight()-YFrame){
				Ycalculado=Game.getHeight()-YFrame;
			}
		}
		
		Game.setLocation(-Xcalculado+Comandos.getWidth(),-Ycalculado+barrapanel.getHeight());
		return (new Dimension(Xcalculado,Ycalculado));
	}
	
	/**
	 * Carga el fondo nuevamente en el reset
	 */
	private void resetFondo(){
		for(int f=0;f<tablero.length;f++){
			for(int c=0;c<tablero[0].length;c++){
				int num=tablero[f][c].getID();
				
				//System.out.println("F "+f+" C "+c+" NUM "+num);
				
				if((11<=num)&&(num<31)){
					fondo[f][c]=null;
					fondo[f][c]=new ImagePanel(mapeo2.get(1));
					//fondo[f][c].cambiarImagen(mapeo2.get(1));
					fondo[f][c].repaint();
				}else{
					if((41<=num)&&(num<61)){
						fondo[f][c].cambiarImagen(mapeo2.get(31));
						fondo[f][c].repaint();
						
					}
				}	
			}
		}
	}
	
	/**
	 * Avanza el robot en la posicion i
	 * @param i Posicion a avanzar
	 */
	private void avanzar(int i){
		
		int x=actualRobot.getX();
		int y=actualRobot.getY();
		Celda actual= tablero[juego.getYRobot()][juego.getXRobot()];
		ImagePanel panelActual=fondo[juego.getYRobot()][juego.getXRobot()];
		
		//System.out.println("AVANZAR X: "+x+" Y: "+y+" I "+i);
		int mX=juego.getXRobot();
		int mY=juego.getYRobot();
		
		if (juego.direccionCorrecta(i)){
		switch (i){
		case 1:{
			if(y>3){
				y=y-4;
				if(mY!=y/48){
					if(juego.puedeAvanzar(i)){
						juego.avanzar(i);
						actualRobot.setLocation(x,y);
					}
				}else{
					actualRobot.setLocation(x,y);
				}	
				
			}
			break;
		}case 2:{
			//System.out.println("CASE 2 ");
			if(x+3<Game.getWidth()){
				x=x+4;
				//System.out.println("mX "+mX+" X/48 "+x/48);
				if(mX!=(x+40)/48){
					if(juego.puedeAvanzar(i)){
						juego.avanzar(i);
						actualRobot.setLocation(x,y);
					}
				}else{
					actualRobot.setLocation(x,y);
				}
			}
			break;
		}case 3:{
			if(y+3<Game.getHeight()){
				y=y+4;
				if(mY!=(y+40)/48){
					if(juego.puedeAvanzar(i)){
						juego.avanzar(i);
						actualRobot.setLocation(x,y);
					}
				}else{
					actualRobot.setLocation(x,y);
				}
			}
			break;
		}case 4:{
			if(x>3){
				x=x-4;
				if(mX!=x/48){
					if(juego.puedeAvanzar(i)){
						juego.avanzar(i);
						actualRobot.setLocation(x,y);
					}
				}else{
					actualRobot.setLocation(x,y);
				}	
			}
			break;
		}default:{
						
		}
		}
		//Si el robot avanzo de casillero y el pincel esta desplegado cambiar la imagen del panel
		if(juego.pincelDesplegado()&&((mX!=juego.getXRobot())||(mY!=juego.getYRobot()))){
			//System.out.println("ENTRA CAMBIAR PANEL");
			tablero= juego.getInfoEscenario();
			//Celda actual= tablero[juego.getYRobot()][juego.getXRobot()];
			int num=actual.getID();
			//System.out.println("NUM "+num);
			//ImagePanel panelActual=fondo[juego.getYRobot()][juego.getXRobot()];
			
			if (num>=51){
				panelActual.cambiarImagen(mapeo2.get(51));
				panelActual.repaint();
			}else{
				if(num>=41){
					panelActual.cambiarImagen(mapeo2.get(41));
					panelActual.repaint();
				}else{
					if((num>=21)&&(num<31)){
						panelActual.cambiarImagen(mapeo2.get(21));
						panelActual.repaint();
					}else{
						if(num>=11){
							panelActual.cambiarImagen(mapeo2.get(11));
							panelActual.repaint();
						}
					}
				}
			}
			
		}
		
		}
			
		
	}
	
	/**
	 * Crea la visualizacion del disparo
	 */
	
	private void crearDisparo(){
		
		BufferedImage bigImg;
		try {
			InputStream in = this.getClass().getClassLoader().getResourceAsStream("Images/48/Sprites/fireball_0.png");
			bigImg = ImageIO.read(in);
				
		final int width = 48;
		final int height = 48;
		final int rows = 8;
		final int cols = 8;
		sprites = new BufferedImage[rows * cols];

		for (int i = 0; i < rows; i++)
		{
		    for (int j = 0; j < cols; j++)
		    {
		        sprites[(i * cols) + j] = bigImg.getSubimage(
		            j * width,
		            i * height,
		            width,
		            height
		        );
		    }
		}
		
		disparo=new JLabel();
		disparo.setBounds(48,0,48,48);
		BufferedImage br=sprites[32];
		disparo.setIcon(new ImageIcon(br));
		
		Game.add(disparo);
		disparo.setVisible(false);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			//System.out.println("ERROR");
		}
	}
	
	
	/**
	 * Muestra la explosion de un objeto
	 */
	private void mostrarExplosion(){
		
 	   disparo.setVisible(false);
 	   disparo.setLocation(Game.getWidth(),Game.getHeight());
 	   BufferedImage exp;
 	   try {
 		   	InputStream in = this.getClass().getClassLoader().getResourceAsStream("Images/48/Sprites/exp2_0.png");
			exp = ImageIO.read(in);
				
		final int width = 48;
		final int height = 48;
		final int rows =4;
		final int cols = 4;
		explosion = new BufferedImage[rows * cols];

		for (int i = 0; i < rows; i++)
		{
		    for (int j = 0; j < cols; j++)
		    {
		        explosion[(i * cols) + j] = exp.getSubimage(
		            j * width,
		            i * height,
		            width,
		            height
		        );
		    }
		}
		
		contBomb=0;
		
		TimerBomb = new javax.swing.Timer(
	              40,
	                new ActionListener(){
	                     
	                    @Override
	                    public void actionPerformed(ActionEvent e) {
	                    	if(contBomb<explosion.length){
	                    		
	                        	modificar.setIcon(new ImageIcon(explosion[contBomb]));			
	                        	contBomb++;
	                    	}else{
	                    		TimerBomb.stop();
	                    		refrescarMatriz2(foco());
	                    		
	                    	}
	                       }
	                       
	                    
	        });
	         
	       TimerBomb.start();
	       
		} catch (IOException e) {
			// TODO Auto-generated catch block
			//System.out.println("ERROR");
		}
	}
	
	
	/**
	 * Realiza un disparo
	 */
	private void Disparar(){
		int i=juego.getDireccion();																					 
		x=0;
		y=0;
		Dimension aux=juego.ejecutarDisparo();
		
		if(aux!=null){
			panelModificar=fondo[(int)aux.getHeight()][(int)aux.getWidth()];
			modificar=miMatriz[(int)aux.getHeight()][(int)aux.getWidth()];
			////System.out.println("Celda a destruir Y "+aux.getHeight()+" X "+aux.getWidth());
		}else{
			modificar=null;
		}
		if(juego.accionEspecialPermitida()){
		switch (i){
			case 1:{
				disparo.setIcon(new ImageIcon(sprites[16]));
				disparo.setLocation(actualRobot.getX(),actualRobot.getY()-48);
				y=-4;
				disparo.setVisible(true);
				break;
			}case 2:{
				
				disparo.setIcon(new ImageIcon(sprites[32]));
				disparo.setLocation(actualRobot.getX()+48,actualRobot.getY());
				x=4;
				//System.out.println("CASE 2: Y: "+ disparo.getY()+" X: "+disparo.getX());
				disparo.setVisible(true);
				break;
			}case 3:{
				//System.out.println("Sur");
				disparo.setIcon(new ImageIcon(sprites[48]));
				disparo.setLocation(actualRobot.getX(),actualRobot.getY()+48);
				y=4;
				disparo.setVisible(true);
				break;
			}case 4:{
				disparo.setIcon(new ImageIcon(sprites[0]));
				disparo.setLocation(actualRobot.getX()-48,actualRobot.getY());
				x=-4;
				disparo.setVisible(true);
				break;
			}default:{
				
			}
		}
		
		swingTimer = new javax.swing.Timer(
	              10,
	                new ActionListener(){
	                     
	                    @Override
	                    public void actionPerformed(ActionEvent e) {
	                    	
	                    	disparo.setLocation(disparo.getX()+x,disparo.getY()+y);
	                    	////System.out.println("Disparo Y: "+ disparo.getY()+" X: "+disparo.getX());
	                    	boolean fueraX=disparo.getX()+Game.getX()>getContentPane().getWidth();
							boolean fueraXbajo=(disparo.getX()+Game.getX()<-48);
							boolean fueraY=disparo.getY()+Game.getY()>getContentPane().getHeight();
							boolean fueraYbajo=(disparo.getY()+Game.getY()<-48);
							////System.out.println("GAME Y: "+Game.getY());
							////System.out.println("GAME X: "+Game.getX());
							////System.out.println("Y calculado "+(disparo.getY()+Game.getY())+" X calculado "+(disparo.getX()+Game.getX()));
							
							//Se fue del panel 
							
	                       if (fueraX||fueraXbajo||fueraY||fueraYbajo){
	                    	  // //System.out.println("fueraX "+fueraX+" fueraXbajo "+fueraXbajo+" fueraY "+fueraY+" fueraYbajo "+fueraYbajo);
	                    	   swingTimer.stop();
	                    	  swingTimer=null;
	                    	  //Situa el disparo fuera de vista
	                    	  disparo.setLocation(-48,-48);
	                       }else{
	                    	   verificarCondicion();
	                       }
	                    	   
	                       
	                       
	                    }
	        });
	         
	        swingTimer.start();
	       
	        //System.out.println(swingTimer.toString());
		}
	}
	/**
	 * Verifica las condiciones necesarias para mostrar la explosion
	 */
	private void verificarCondicion(){
		if(modificar!=null){
			
			int MY=panelModificar.getY()/48;
			int MX=panelModificar.getX()/48;
			int DX=disparo.getX()/48;
			int DY=disparo.getY()/48;
			////System.out.println("DY: "+DY+" DX "+DX+" MY "+MY+" MX "+MX);
			if((MY==DY)&&(MX==DX)){
				
				swingTimer.stop();
				swingTimer=null;
		  	   	mostrarExplosion();
		  	   	
		  	   	refrescarMatriz2(foco());
			}
		}
	}
	/**
	 * Carga un coleccionable al baul
	 */
	private void cargarColeccionable(){
		juego.cargarColeccionable();
		Dimension d=this.foco();
		this.refrescarMatriz2(d);
	}
	/**
	 * Descarga el ultimo coleccionable agregado
	 */
	private void descargarColeccionable(){
		juego.descargarColeccionable();
		Dimension d=this.foco();
		this.refrescarMatriz2(d);
	}
	
	// ==============================================================
		//			SUB-CLASE DE KeyAdapter
		// ==============================================================
		
		private class KeyComando extends KeyAdapter{
			public void keyPressed(KeyEvent e){
				int key = e.getKeyCode();
				
				if (key == KeyEvent.VK_W){
					avanzar(1);
					accionarInterfaz();
					
				}else if (key == KeyEvent.VK_D){
					avanzar(2);
					accionarInterfaz();
				}else if (key == KeyEvent.VK_S){
					avanzar(3);
					accionarInterfaz();
				}else if (key == KeyEvent.VK_A){
					avanzar(4);
					accionarInterfaz();
				}else if (key == KeyEvent.VK_RIGHT){
					juego.girarDerecha();
					actualizarCombustible();
					actualizarRobot();
				}else if (key == KeyEvent.VK_LEFT){
					juego.girarIzquierda();
					actualizarCombustible();
					actualizarRobot();
				}else if(key == KeyEvent.VK_K){
					if(swingTimer==null){
						//System.out.println("SPACE");
						Disparar();
					}
				}else if(key == KeyEvent.VK_C){
					cargarColeccionable();
					
				}else if(key == KeyEvent.VK_V){
					descargarColeccionable();
					
				}else if(key == KeyEvent.VK_B){
					//System.out.println("B");
					juego.desplegarPincel();
					juego.cambiarColorPintura(2);
					//refrescarMatriz2(foco());
				}else if(key == KeyEvent.VK_N){
					//System.out.println("N");
					juego.desplegarPincel();
					juego.cambiarColorPintura(1);
					//refrescarMatriz2(foco());
				}else if(key == KeyEvent.VK_L){
					juego.replegarPincel();
					
				}
			}
			
			public void keyReleased(KeyEvent e){
				
				}
		}
		
		// ==============================================================
		//			Oyente botón reset
		// ==============================================================
		
		
		private class OyenteReset implements ActionListener{
	        public void actionPerformed(ActionEvent e){
	               juego.reiniciarSimulacion();   
	               actualRobot.setLocation(juego.getXRobot()*48,juego.getYRobot()*48);
	               actualRobot.setIcon(mapeo.get(juego.getIDRobot()));
	               Dimension aux=foco();
	               tablero=juego.getInfoEscenario();
	               resetFondo();
	               refrescarMatriz2(aux);
	              puntaje.setText("Puntos "+juego.getPuntaje());
	               actualizarCombustible();
	               eliminarListeners();
	              
	               comenzar.setEnabled(true);
	        }

	  }
		
		// ==============================================================
		//			Oyente botón comenzar
		// ==============================================================
				
				
		private class OyenteComenzar implements ActionListener{
		    public void actionPerformed(ActionEvent e){
		    	comenzar.setEnabled(false);
		       // juego.comenzarSimulacion();    
		        comenzar();
		    }
	  }
		
		
		// ==============================================================
		//			Oyente Comandos
		// ==============================================================
						
						
		private class OyenteComando implements ActionListener{
		    public void actionPerformed(ActionEvent e){
		    	String s=((JButton) e.getSource()).getName();
		    	//System.out.println("EJECUTA");
		    	//contenedor.addKeyListener(new KeyComando());
		    	contenedor.requestFocus();
		    	//System.out.println(s);
			    	switch (s){
			    	case "Izquierda":{
			    		juego.girarIzquierda();
						actualizarCombustible();
						actualizarRobot();
			    		break;
			    	}case "Derecha":{
			    		juego.girarDerecha();
						actualizarCombustible();
						actualizarRobot();
			    		break;
			    	}case "Sin color":{
			    		juego.replegarPincel();
			    		break;
			    	}case "Cargar":{
			    		cargarColeccionable();
			    		break;	
			    	}case "Descargar":{
			    		descargarColeccionable();
			    		break;
			    	}case "Negro":{
			    		juego.desplegarPincel();
						juego.cambiarColorPintura(1);
			    		break;
			    	}case "Blanco":{
			    		juego.desplegarPincel();
						juego.cambiarColorPintura(2);
			    		break;
			    	}case "Disparo":{
			    		if(swingTimer==null){
							
							Disparar();
						}
			    		break;
			    	}default:{
			    		
			    	}
			    	}
			    	
			    }
		  }
		
		


}
